package com.vy.stl.service.impl;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.sun.xml.internal.bind.v2.TODO;
import com.vy.stl.entity.Course;
import com.vy.stl.entity.Reserve;
import com.vy.stl.mapper.CourseMapper;
import com.vy.stl.mapper.ReserveMapper;
import com.vy.stl.service.CourseService;
import com.vy.stl.vo.CourseVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;


import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * @create: 2025/08/30 17:49
 * @description:
 */
@Service
public class CourseServiceImpl implements CourseService {

    @Autowired
    private CourseMapper courseMapper;

    @Autowired
    private ReserveMapper reserveMapper;

    @Override
    public List<CourseVO> search(Course course) {
        return courseMapper.select(course);
    }

    @Override
    public PageInfo searchByPage(Integer page, Integer limit, Course course) {
        if (ObjectUtils.isEmpty(page)) page = 1;
        if (ObjectUtils.isEmpty(limit)) limit = 10;
        /*
        PageHelper：基于MyBatis拦截器（Interceptor）实现的分页插件
        startPage(page, limit)：在当前线程中设置分页参数，并触发后续SQL的自动分页改写
        当调用startPage(page, limit)时，PageHelper会将page和limit存入ThreadLocal（线程本地变量）中，确保分页参数仅对当前线程的后续查询生效。紧接着执行的MyBatis mapper方法会被PageHelper的拦截器拦截，插件会自动分析原始SQL，并根据数据库类型改写SQL，添加分页条件：MySQL，会在SQL末尾添加LIMIT (page-1)*limit, limit；Oracle，会通过ROWNUM实现分页逻辑
        原本查询全量数据的SQL被改写成只查询“当前页数据”的SQL，避免一次性加载所有数据，减少数据库压力和网络传输量
        */
        //开启分页拦截，改写SQL实现物理分页
        PageHelper.startPage(page, limit);
        List<CourseVO> courses = courseMapper.select(course);
        /*PageInfo<CourseVO> pageInfo = new PageInfo<>(courses);：封装完整分页元数据：
        封装的核心信息：
        基础数据：当前页的CourseVO列表（list属性）；
        分页参数：当前页码（pageNum）、每页条数（pageSize）；
        统计数据：总记录数（total）、总页数（pages = 总记录数 / 每页条数，向上取整）；
        导航信息：是否为第一页（isFirstPage）、是否为最后一页（isLastPage）、上一页页码（prePage）、下一页页码（nextPage）等。
        */
        /*
        PageInfo<CourseVO> pageInfo：声明泛型化的PageInfo变量，作为分页数据的“载体”。
            PageInfo：泛型类，PageHelper提供的分页信息封装类；
            <CourseVO>：PageInfo对象只能存储CourseVO类型的数据；
            pageInfo：持有通过new PageInfo<>(courses)创建的PageInfo实例
        new PageInfo<>(courses)：自动从上下文读取ThreadLocal中的参数（page,limit），基于当前页课程列表数据，调用构造方法补全信息（如size:当前页实际条数,list:当前页数据列表），自动计算并封装完整的分页元数据（pages、导航状态、导航页码组）
        */
        PageInfo<CourseVO> pageInfo = new PageInfo<>(courses);
        return pageInfo;
    }

    @Override
    public int add(Course course) throws Exception {
        //1. 如果该房间在同一时间段内被占用了，那么课程不能添加
            //①获取房间名称、开课时间
            //②根据被添加的房间名和开课时间作为条件查询数据库
            //③如果有结果，则说明该房间已经被占用，无法添加，否则就可以添加
        // TODO 判断该房间同一个时间内，是否有预定的课程
        /*Date startTime = course.getTime();
        DateTime endTime = DateUtil.offsetMinute(startTime, course.getLength());
        List<Course> courseList = courseMapper.selectByRoomAndTime(course.getRoom(),startTime,endTime);
        if (courseList.size() > 0) {
            //在同一时间段内房间被占用
            throw ne w Exception("这个时间段，房间已经被占用");
        }*/
        return courseMapper.insert(course);
    }

    @Override
    public int edit(Course course) {
        return courseMapper.edit(course);
    }

    @Override
    public int remove(Integer id) throws Exception {
        //1.该课程还存在
        Course course = courseMapper.selectByPrimaryKey(id);
        if (ObjectUtils.isEmpty(course)) {
            throw new Exception("该课程已经不存在，无法删除");
        }
        //2.该课程没有被预约
        List<Reserve> reserveList =  reserveMapper.selectByCourseId(id);
        if (reserveList.size() > 0) {
            throw new Exception("该课程已经被预约，无法被删除");
        }
        /*自定义设想：①时间过了；②时间没过，没预约*/
        return courseMapper.deleteById(id);
    }
}
